package com.easpeed.user.bean

import android.util.Log;
import com.bigyu.utils.Logger
import com.easpeed.comon.utils.SendCommand
import com.easpeed.comon.utils.bytesToHex
import com.easpeed.comon.utils.compressData
import com.easpeed.comon.utils.hexStringToJson
import com.easpeed.comon.utils.hexToBytes
import com.easpeed.comon.utils.isBigCommand
import com.easpeed.comon.utils.parseSinglePacket
import com.easpeed.comon.utils.print
import com.easpeed.elevator.BuildConfig

/**
 * Created by bigyu on 2024/10/31 14:18
 * com.easpeed.user.bean
 */
open class TcpBean {
    open var head = byteArrayOf(0x7F, 0x7E, 0x7F).bytesToHex()

    open var deviceId = ""

    open var appType = ""

    open var command = ""

    open var dataLength = 0

    open var data = ""

    open var originalData = ""

    open var dataBytes: ByteArray? = null

    open var end = byteArrayOf(0x6F, 0x6E, 0x6F).bytesToHex()

    @JvmOverloads
    fun createTcpPacket(allMsg: Boolean = false): ByteArray {
        val start = System.currentTimeMillis()

        // 帧头（3 字节）
        val header = head.hexToBytes()
        // 设备 ID (8 字节)，将 deviceId 填充或截断到 8 字节长度
        val deviceIdBytes = deviceId.padEnd(8).toByteArray().copyOf(8)

        // APP 类型（1 字节）
        val appTypeByte = appType.padEnd(1).hexToBytes()


        // 命令（2 字节）
        val commandBytes = command.hexToBytes()

        val temp = data.toByteArray(Charsets.UTF_8)
        // 数据长度（4 字节）
// 将字符串转换为字|节数组
        var dataBytes = temp
        val start2 = System.currentTimeMillis()
        if (isBigCommand(commandBytes)) {
            // 将字符串转换为字|节数组
            try {
                dataBytes = compressData(temp)
            } catch (e: Exception) {
                dataBytes = "".toByteArray()
            }
        }
        "压缩后数据长度: ${dataBytes.size} ,原始数据长度: ${temp.size}  ,命令: $command , 耗时:${System.currentTimeMillis() - start2}".print()
// 计算数据的字节长度
        val dataLength = dataBytes.size
// 将长度转换为字节数组（4字节表示）
        val dataLengthBytes = byteArrayOf(
            (dataLength shr 24).toByte(), // 高 8 位
            (dataLength shr 16).toByte(), // 次高 8 位
            (dataLength shr 8).toByte(),  // 次低 8 位
            dataLength.toByte()          // 低 8 位
        )

        // 结束帧（3 字节）
        val footer = end.hexToBytes()

        // 组装所有部分
        val bytes = header + deviceIdBytes + appTypeByte + commandBytes + dataLengthBytes + dataBytes + footer

        if (BuildConfig.DEBUG) {

            var tempAllMsg = allMsg
            if (!isBigCommand(commandBytes)) {
                tempAllMsg = true
            }
            "".print()
            "".print()
            if (tempAllMsg) {
                "发送的原始数据包=>组装耗时: ${System.currentTimeMillis() - start} 额外字段长度: ${dataLength} ,实际报文=> ${bytes.joinToString(" ") { String.format("%02X", it) }}".print()
                parseSinglePacket(bytes , true)
            } else {
                "发送的原始数据包=>组装耗时: ${System.currentTimeMillis() - start} 额外字段长度: ${dataLength} ".print()
            }
        }
        if (commandBytes.contentEquals(SendCommand.commandMatrixResponse)) {
            parseSinglePacket(bytes , true)
        }
        return bytes
    }

//    fun createTcpPacket(deviceId: String, appType: Byte, command: ByteArray, data: ByteArray): ByteArray {
//        // 帧头（3 字节）
//        val header = byteArrayOf(0x7F, 0x7E, 0x7F)
//
//        // 设备 ID (8 字节)，将 deviceId 填充或截断到 8 字节长度
//        val deviceIdBytes = deviceId.padEnd(8).toByteArray().copyOf(8)
//
//        // APP 类型（1 字节）
//        val appTypeByte = byteArrayOf(appType)
//
//        // 命令（2 字节）
//        val commandBytes = command.copyOf(2)
//
//        // 数据长度（2 字节）
//        val dataLength = data.size
//        val dataLengthBytes = byteArrayOf((dataLength shr 8).toByte(), dataLength.toByte())
//
//        // 数据
//        val dataBytes = data
//
//        // 结束帧（3 字节）
//        val footer = byteArrayOf(0x6F, 0x6E, 0x6F)
//
//        // 组装所有部分
//        val bytes = header + deviceIdBytes + appTypeByte + commandBytes + dataLengthBytes + dataBytes + footer
//
//
//        "".print()
//        "".print()
//        "发送的原始数据包=>${bytes.joinToString(" ") { String.format("%02X", it) }}".print()
//        return bytes
//    }
//
//    fun parseData(data: ByteArray): TcpBean {
//        try {
//            val header = data.sliceArray(0..2)
//            val deviceId = data.sliceArray(3..10).toString(Charsets.US_ASCII)
//            val appType = data[11]
//            val command = data.sliceArray(12..13)
////        val dataLength = (data[14].toInt() shl 8) or (data[15].toInt() and 0xFF)
//            val dataLength = ((data[14].toInt() and 0xFF) shl 8) or (data[15].toInt() and 0xFF)
//            try {
//                val actualData = data.sliceArray(16 until (16 + dataLength))
//                this.originalData = actualData.bytesToHex()
//                this.data = actualData.bytesToHex().hexStringToJson()
//            } catch (e: Exception) {
//                e.printStackTrace()
//            }
//
//
//            head = header.joinToString("") { String.format("%02X", it) }
//
//            this.deviceId = deviceId.trim()
//            this.appType = String.format("%02X", appType)
//            this.command = command.bytesToHex()
//            this.dataLength = dataLength
//
//
//
//            if (BuildConfig.DEBUG) {
//
//                Logger.e("TAG", "帧头: ${header.joinToString(" ") { String.format("%02X", it) }}")
//                Logger.e("TAG", "设备ID号: $deviceId")
//                Logger.e("TAG", "APP类型: ${String.format("%02X", appType)}")
//                Logger.e("TAG", "命令: ${command.joinToString(" ") { String.format("%02X", it) }}")
//                Logger.e("TAG", "数据长度: ${this.dataLength}")
//                Logger.e("TAG", "数据: ${this.data}")
//                Logger.e("TAG", "原始: ${this.originalData}")
//                try {
//                    val footer = data.sliceArray((16 + dataLength) until data.size)
//                    this.end = footer.bytesToHex()
//                    Logger.e("TAG", "结束帧: ${footer.joinToString(" ") { String.format("%02X", it) }}")
//                } catch (e: Exception) {
//                    e.printStackTrace()
//                    Logger.e("TAG", "parseData:222 ${e.message}")
//
//                }
//
//                Logger.e("TAG", "${this.head}${this.deviceId}${this.appType}${this.command}${this.dataLength}${this.data}${this.end}")
//            }
//        } catch (e: Exception) {
//            e.printStackTrace()
//            Logger.e("TAG", "parseData: ${e.message}")
//        }
//
//        return this
//    }

}